package com.briup.server.web.controller;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.briup.common.response.Result;
import com.briup.server.domain.dto.MenuDTO;
import com.briup.server.domain.dto.MenuMoveDTO;
import com.briup.server.domain.dto.MenuQueryDTO;
import com.briup.server.domain.vo.MenuVO;
import com.briup.server.log.LogAccess;
import com.briup.server.service.MenuService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Slf4j
@Tag(name = "菜单权限管理模块")
@RestController
@RequestMapping("/menus")
@RequiredArgsConstructor
public class MenuController {

    private final MenuService menuService;

    @Operation(summary = "查询查询所有的菜单列表（通过权限树的形式返回）")
    @GetMapping("/list")
    public Result<List<MenuVO>> list() {
        List<MenuVO> menuVOS = menuService.listMenus();
        return Result.success(menuVOS)
                .apply("查询成功");
    }

    @LogAccess("分页查询菜单列表")
    @Operation(summary = "分页查询菜单列表（通过权限树的形式返回）")
    @GetMapping("/page")
    public Result<Page<MenuVO>> page(MenuQueryDTO menuQueryDTO) {
        Page<MenuVO> menuVOS = menuService.pageMenus(menuQueryDTO);
        return Result.success(menuVOS)
                .apply("查询成功");
    }

    @LogAccess("新增菜单信息")
    @Operation(summary = "保存菜单")
    @PostMapping("/save")
    public Result<?> save(@RequestBody @Valid MenuDTO menuDTO) {
        menuService.saveOrUpdateMenu(menuDTO);
        return Result.success(null)
                .apply("保存成功");
    }

    @Operation(summary = "更新菜单）")
    @PutMapping("/update")
    public Result<?> update(@RequestBody @Valid MenuDTO menuDTO) {
        menuService.saveOrUpdateMenu(menuDTO);
        return Result.success(null)
                .apply("更新成功");
    }

    @Operation(summary = "菜单移动（移动菜单的位置（必须保证只能在同个父菜单下））")
    @PostMapping("/move")
    public Result<?> move(@RequestBody @Valid MenuMoveDTO menuMoveDTO) {
        log.info("菜单移动参数：{}", menuMoveDTO);
        menuService.moveMenu(menuMoveDTO);
        return Result.success(null)
                .apply("移动成功");
    }

    @Operation(summary = "删除菜单（如存在子菜单，那么不能删除）")
    @DeleteMapping("/delete/{id}")
    public Result<?> delete(@PathVariable("id") Long id) {
        log.info("删除菜单参数：{}", id);
        menuService.removeMenu(id);
        return Result.success(null)
                .apply("删除成功");
    }
}
